package edu.uoc.tdp.client.conexio;

import edu.uoc.tdp.beans.conexio.Administrador;
import edu.uoc.tdp.beans.conexio.Estudiant;
import edu.uoc.tdp.beans.conexio.ResponsableEvents;
import edu.uoc.tdp.beans.conexio.Usuari;
import edu.uoc.tdp.common.EOlympicsException;
import edu.uoc.tdp.common.EOlympicsExceptionConnexio;
import edu.uoc.tdp.common.RemotConexioInterface;
import edu.uoc.tdp.common.TDSLanguageUtils;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Grup TDP 1X4J
 */
public class PantallaLogin extends javax.swing.JDialog {

    private RemotConexioInterface serveiRMIConnexio;
    private Administrador AdminLogin;
    private ResponsableEvents REventsLogin;
    private Estudiant EstudLogin;
    
    private int Reintents;
    
    /**
     * Creates new form PantallaLogin
     */
    public PantallaLogin(java.awt.Frame parent, boolean modal, 
                         RemotConexioInterface serveiRMIConnexio) throws EOlympicsExceptionConnexio {

        super(parent, modal);
        
        TDSLanguageUtils.setDefaultLanguage("edu/uoc/tdp/i18n/messages");
        initComponents();
        
        this.serveiRMIConnexio = serveiRMIConnexio;
        
        setLocationRelativeTo(parent);
        
        setTitle(TDSLanguageUtils.getMessage("titol.general") + " - " +
                 TDSLanguageUtils.getMessage("connexio.pantalla.login.titol"));
        LabelConnexio.setText(TDSLanguageUtils.getMessage("connexio.pantalla.login.textConnexio"));
        LabelUsuari.setText(TDSLanguageUtils.getMessage("connexio.pantalla.login.textUsuari"));
        LabelContrassenya.setText(TDSLanguageUtils.getMessage("connexio.pantalla.login.textPwd"));
        BotoCancellar.setText(TDSLanguageUtils.getMessage("connexio.pantalla.login.btnCancellar"));
        BotoConnectar.setText(TDSLanguageUtils.getMessage("connexio.pantalla.login.btnConnectar"));
        
    }

    private PantallaLogin() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        LabelImatge = new javax.swing.JLabel();
        TextUsuari = new javax.swing.JTextField();
        LabelUsuari = new javax.swing.JLabel();
        TextContrassenya = new javax.swing.JPasswordField();
        BotoConnectar = new javax.swing.JButton();
        BotoCancellar = new javax.swing.JButton();
        LabelContrassenya = new javax.swing.JLabel();
        LabelConnexio = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        LabelImatge.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/Fons_Login.png"))); // NOI18N

        LabelUsuari.setLabelFor(TextUsuari);
        LabelUsuari.setText("Identificador Usuari");
        LabelUsuari.setNextFocusableComponent(TextUsuari);

        TextContrassenya.setToolTipText("");

        BotoConnectar.setText("Connectar");
        BotoConnectar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotoConnectarActionPerformed(evt);
            }
        });

        BotoCancellar.setText("Cancel·lar");
        BotoCancellar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotoCancellarActionPerformed(evt);
            }
        });

        LabelContrassenya.setLabelFor(TextContrassenya);
        LabelContrassenya.setText("Contrassenya");

        LabelConnexio.setText("Per a poder accedir al sistema ha d'identificar-se...");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(12, 12, 12)
                .addComponent(LabelImatge, javax.swing.GroupLayout.DEFAULT_SIZE, 193, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(LabelUsuari, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(LabelContrassenya, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(0, 0, 0)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(BotoConnectar)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(BotoCancellar))
                            .addGroup(layout.createSequentialGroup()
                                .addGap(57, 57, 57)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(TextContrassenya, javax.swing.GroupLayout.PREFERRED_SIZE, 117, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(TextUsuari, javax.swing.GroupLayout.PREFERRED_SIZE, 117, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                    .addComponent(LabelConnexio, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(18, 18, 18))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(LabelImatge, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(19, 19, 19)
                .addComponent(LabelConnexio)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(TextUsuari, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(LabelUsuari))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(TextContrassenya, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(LabelContrassenya))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(BotoConnectar, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(BotoCancellar))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void BotoConnectarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotoConnectarActionPerformed
        try {
            // Comprovar que l'usuari és a la BD
            Usuari usu = serveiRMIConnexio.getUsuari(TextUsuari.getText(), "");

            if (null != usu) {
                // L'usuari es a la BD. Comprovem ara la contrassenya
                String Contrassenya = new String(TextContrassenya.getPassword());
                if (usu.getEstatEnSistema().equals("B")) {
                    // L'usuari té el compte bloquejat. Sortim avisant
                    JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("connexio.pantalla.login.missatge.usuBloquejat"),
                            "Error", JOptionPane.ERROR_MESSAGE);
                    this.setVisible(false);
                } else if (usu.getPwd().equals(Contrassenya)) {
                    // Contrassenya trobada. Instanciem usuari segons el tipus.
                    // Ho fem per ordre de possibilitats de trobar per a fer-ho més eficient
                    EstudLogin = serveiRMIConnexio.getEstudiant(TextUsuari.getText(), Contrassenya);
                    if (null == EstudLogin) {
                        REventsLogin = serveiRMIConnexio.getResponsableEvents(TextUsuari.getText(), Contrassenya);
                        if (null == REventsLogin) {
                            AdminLogin = serveiRMIConnexio.getAdministrador(TextUsuari.getText(), Contrassenya);
                            if (null == AdminLogin) {
                                // Error d'inconsistència a la Base de Dades (Usuaris)
                                JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("ERR_BD_CORRUPTA"),
                                        "Error", JOptionPane.ERROR_MESSAGE);
                                this.setVisible(false);
                            }
                        }
                    }
                    // Proces d'identificació correcte. Tornem al MenuGeneral.
                    JOptionPane.showMessageDialog(null,
                            TDSLanguageUtils.getMessage("connexio.pantalla.login.missatge.usuBenvingut") + " "
                            + usu.getCognom1() + " " + usu.getCognom2() + ", " + usu.getNom(),
                            TDSLanguageUtils.getMessage("connexio.pantalla.login.missatge.usuIdentificat"),
                            JOptionPane.INFORMATION_MESSAGE);
                    this.setVisible(false);
                } else {
                    // La contrassenya és incorrecta. Avisem i afegim un reintent. 
                    // Si els reintents s'han acabat, bloquejem l'usuari i sortim
                    Reintents--;
                    if (Reintents == 0) {
                        // Gravar bloqueig de l'usuari
                        serveiRMIConnexio.setBloqueigUsuari(usu.getIdIntern());
                        JOptionPane.showMessageDialog(null,
                                TDSLanguageUtils.getMessage("connexio.pantalla.login.missatge.usuBloqueig"),
                                TDSLanguageUtils.getMessage("connexio.pantalla.login.missatge.pwdIncorrecte"),
                                JOptionPane.ERROR_MESSAGE);
                        this.setVisible(false);
                    } else {
                        JOptionPane.showMessageDialog(null,
                                TDSLanguageUtils.getMessage("connexio.pantalla.login.missatge.liQueden")
                                + " " + Reintents + " "
                                + TDSLanguageUtils.getMessage("connexio.pantalla.login.missatge.reintents"),
                                TDSLanguageUtils.getMessage("connexio.pantalla.login.missatge.pwdIncorrecte"),
                                JOptionPane.ERROR_MESSAGE);
                        TextContrassenya.requestFocus();
                    }
                }
            } else {
                // No hi ha cap usuari amb aquest Identificador.
                JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("connexio.pantalla.login.missatge.UsuNoTrobat"),
                        "Error", JOptionPane.ERROR_MESSAGE);
                TextUsuari.requestFocus();
            }


        } catch (RemoteException ex) {
            Logger.getLogger(PantallaLogin.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog
                    (null, TDSLanguageUtils.getMessage("ERR_REMOT_LOGIN"), "Error", JOptionPane.ERROR_MESSAGE);
        } catch (EOlympicsException ex) {
            Logger.getLogger(PantallaLogin.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog
                    (null, TDSLanguageUtils.getMessage("ERR_LOGIN"), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_BotoConnectarActionPerformed

    private void BotoCancellarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotoCancellarActionPerformed
        setVisible(false);
    }//GEN-LAST:event_BotoCancellarActionPerformed

    /**
     * Accessor de lectura de l'objecte Administrador de la finestra de login.
     *
     * @return Objecte Administrador login de la finestra de Login
     */
    public Administrador getAdminLogin() {
        return AdminLogin;
    }

    /**
     * Accessor d'escriptura de l'objecte Administrador de la finestra de login.
     *
     * @param AdminLogin Objecte Administrador de la finestra de Login
     */
    public void setAdminLogin(Administrador AdminLogin) {
        this.AdminLogin = AdminLogin;
    }

    /**
     * Accessor de lectura de l'objecte Responsable Events de la finestra de login.
     *
     * @return Objecte Responsable d'Events login de la finestra de Login
     */
    public ResponsableEvents getREventsLogin() {
        return REventsLogin;
    }

    /**
     * Accessor d'escriptura de l'objecte Responsable Events de la finestra de login.
     *
     * @param REventsLogin Objecte Responsable Events de la finestra de Login
     */
    public void setREventsLogin(ResponsableEvents REventsLogin) {
        this.REventsLogin = REventsLogin;
    }

    /**
     * Accessor de lectura de l'objecte Estudiant de la finestra de login.
     *
     * @return Objecte Estudiant login de la finestra de Login
     */
    public Estudiant getEstudLogin() {
        return EstudLogin;
    }

    /**
     * Accessor d'escriptura de l'objecte Estudiant de la finestra de login.
     *
     * @param EstudLogin Objecte Estudiant de la finestra de Login
     */
    public void setEstudLogin(Estudiant EstudLogin) {
        this.EstudLogin = EstudLogin;
    }

    /**
     * Accessor d'escriptura dels reintents de la finestra de login.
     *
     * @param AdminLogin Objecte Estudiant de la finestra de Login
     */
    public void setReintents(int Reintents) {
        this.Reintents = Reintents;
    }

    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton BotoCancellar;
    private javax.swing.JButton BotoConnectar;
    private javax.swing.JLabel LabelConnexio;
    private javax.swing.JLabel LabelContrassenya;
    private javax.swing.JLabel LabelImatge;
    private javax.swing.JLabel LabelUsuari;
    private javax.swing.JPasswordField TextContrassenya;
    private javax.swing.JTextField TextUsuari;
    // End of variables declaration//GEN-END:variables
}
